/**
 * <pre>
 * Title: 		PersistService.java
 * Author:		linriqing
 * Create:	 	2012-3-9 下午04:17:20
 * Copyright: 	Copyright (c) 2012
 * Company:		Shenzhen Helper
 * <pre>
 */
package com.hengpeng.itfints.service;

import java.util.Collection;
import java.util.List;

import com.hengpeng.common.persist.QueryResult;
import com.hengpeng.common.persist.entity.AbstractEntity;
import com.hengpeng.common.persist.query.DynamicQuery;

/**
 * <pre>
 * 持久层接口
 * </pre>
 * @author linriqing
 * @version 1.0, 2012-3-9
 */
public interface PersistService
{

	/**
	 * <pre>
	 * 持久化实体对象
	 * </pre>
	 * @param <T> 实体类型
	 * @param entity 实体对象
	 * @return 持久化后的实体对象
	 */
	<T extends AbstractEntity> T save(T entity);

	/**
	 * <pre>
	 * 持久化实体对象
	 * </pre>
	 * @param <T> 实体类型
	 * @param entity 实体对象
	 * @return 持久化后的实体对象
	 */
	void saveAllObject(Collection<? extends AbstractEntity> entitys);

	/**
	 * <pre>
	 * 根据主键获取持久化的实体对象
	 * </pre>
	 * @param <T> 实体类型
	 * @param type 实体类型
	 * @param id 实体主键
	 * @return 持久化的实体对象
	 */
	<T extends AbstractEntity> T get(Class<T> type, Object id);

	/**
	 * <pre>
	 * 更新持久化实体对象
	 * </pre>
	 * @param <T> 实体类型
	 * @param entity 实体对象
	 * @return 更新后的持久化实体对象
	 */
	<T extends AbstractEntity> T update(T entity);

	/**
	 * <pre>
	 * 获取所有持久化的实体对象
	 * </pre>
	 * @param <T> 实体类型
	 * @param type 实体类型
	 * @return 实体对象集合
	 */
	<T extends AbstractEntity> List<T> list(Class<T> type);

	/**
	 * <pre>
	 * 查询持久化的实体对象
	 * </pre>
	 * @param <T> 实体类型
	 * @param type 实体类型
	 * @param query 动态查询参数
	 * @return 实体对象集合
	 */
	<T extends AbstractEntity> List<T> find(Class<T> type, DynamicQuery query);

	public Long count(DynamicQuery query);

	/**
	 * <pre>
	 * 删除持久化的实体对象
	 * </pre>
	 * @param entity 实体对象
	 */
	void delete(AbstractEntity entity);

	/**
	 * <pre>
	 * 删除持久化的实体对象
	 * </pre>
	 * @param <T> 实体类型
	 * @param type 实体类型
	 * @param id 实体主键
	 */
	<T extends AbstractEntity> void delete(Class<T> type, Object id);

	/**
	 * 查询Page总条数
	 * @param type
	 * @param query
	 * @return
	 */
	<T extends AbstractEntity> Long findPageCount(DynamicQuery query, String property);

	/**
	 * <pre>
	 *  查询集合
	 * </pre>
	 * @param <T> 实体类型
	 * @param type 实体类型
	 * @param query 动态查询参数
	 * @return
	 */
	<T extends AbstractEntity> QueryResult<T> findWithPage(Class<T> type, DynamicQuery query);

	/**
	 * 查询以对象方式返回
	 * @param <T> 实体类型
	 * @param type 实体类型
	 * @param query 动态查询参数
	 * @return
	 */
	<T extends AbstractEntity> List<Object> findObject(Class<T> type, DynamicQuery query);
	/**
	 * <pre>
	 * 获取当个实体
	 * </pre>
	 * @param query
	 * @param clz
	 * @return
	 */
	public <T extends AbstractEntity> T getEntity(DynamicQuery query, Class<T> clz);

}
